package com.hdp.kotlin_samples.base

/**
 * author:hdp
 * on:2019/6/11:22:49
 * desc:when
 *
 *
 * kotlin中的when表达式十分强大，可以取代switch,也可以替代if else嵌套
 *
 * 1、when 可以作为条件语句使用，也可以作为表达式使用（有返回值）
 * 2、when 将它的参数和所有的分支条件顺序比较，直到某个分支满足条件。
 * 3、如果它被当做表达式，符合条件的分支的值就是整个表达式的值(当分支是代码块时候，最后一行代码的值作为返回值)
 * 4、如果when作为一个表达式使用，则必须有else分支，除非编译器能够检测出所有的可能情况都已经覆盖了。（比如使用密封类）
 * 5、 如果很多分支需要用相同的方式处理，则可以把多个分支条件放在一起，用逗号分隔
 */

fun main() {
//    test_when1()
//    test_when2()
//    test_when3()
//    test_when4()
//    test_when5(12)
    test_when6()
}

//像Java一样使用
private fun test_when1() {
    var number = 4
    when (number) {
        1 -> println("One")
        2 -> println("Two")
        3 -> println("Three")
        4 -> println("Four")
        5 -> println("Five")
        else -> println("invalid number")
    }
}

//作为表达式使用
private fun test_when2() {
    var number = 4
    var numberProvided = when (number) {
        1 -> "One"
        2 -> "Two"
        3 -> "Three"
        4 -> "Four"
        5 -> "Five"
        else -> "invalid number"
    }
    println("You provide $numberProvided")
}

//使用条件块中包含的多个语句。
private fun test_when3() {
    var number = 1
    when (number) {
        1 -> {
            println("Monday")
            println("First day of the week")
        }
        7 -> println("Sunday")
        else -> println("Other days")
    }
}

//when 多个分支,使用，分隔
private fun test_when4() {
    var number = 8
    when (number) {
        3, 4, 5, 6 ->
            println("It is summer season")
        7, 8, 9 ->
            println("It is rainy season")
        10, 11 ->
            println("It is autumn season")
        12, 1, 2 ->
            println("It is winter season")
        else -> println("invalid input")
    }
}

//范围和转型
private fun test_when5(param: Any) {
    when (param) {
        is String ->
            println("value is String")
        !in 0..8 ->
            println("Value is in 0..8")
        is Int ->
            println("Value is Int")
        else ->
            println("invalid input")

    }
}

//无自变量的when,复杂的判断逻辑时常用
private fun test_when6() {
    var x = 8
    var s = listOf<String>("", "abc", "ccc")
    var v = "888"
    val result = when {
        x in 1..10 -> {
            "aaa"
            test()
        }
        s.contains("hello") -> "it's a welcome!"
        v is String -> "String value is $v"
        x == 100 -> "value is 100"
        else -> ""
    }
    println(result)
}

private fun test() {

}